/*
 * File:   10977.cpp
 * Author: xerxes
 *
 * Created on September 16, 2011, 12:13 AM
 *
 * I have not failed, I have just found 10000 ways that won't work.
 */

#include <iostream>
#include <algorithm>
#include <vector>
#include <sstream>
#include <fstream>
#include <string>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <functional>
#include <bitset>
#include <iomanip>

#include <ctime>
#include <cassert>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <climits>
#include <cstring>
#include <cstdlib>

using namespace std;

#define VI vector< int >
#define CI( x ) scanf("%d",&x)
#define CL( x ) scanf("%lld",&x)
#define CD( x ) scanf("%lf",&x )
#define fo(i,st,ed) for(int i = st ; i < ed ; ++i )
#define foE(i,st,ed) for(int i = st ; i <= ed ; ++i )
#define foit(i, x) for (typeof((x).begin()) i = (x).begin(); i != (x).end(); i++)
#define bip system("pause")
#define Int long long
#define pb push_back
#define SZ(X) (int)(X).size()
#define LN(X) (int)(X).length()
#define mk make_pair
#define f first
#define s second
#define SET( ARRAY , VALUE ) memset( ARRAY , VALUE , sizeof(ARRAY) )

inline void wait(double seconds) {
    double endtime = clock()+(seconds * CLOCKS_PER_SEC);
    while (clock() < endtime) {
        ;
    }
}

int grid[210][210];
int cost[210][210];
int R,C;
int tot;
vector< pair<int, pair<int,int> > > e;
int mr[4]={-1,+1,+0,+0};
int mc[4]={+0,+0,-1,+1};

inline void Read() {
    SET(grid,0);
    e.clear();
    int b;
    CI(b);
    int x,y;
    fo(i,0,b){
        CI(x);
        CI(y);
        grid[x-1][y-1]=-1;
    }
    CI(tot);
    int r;
    fo(i,0,tot){
        CI(x);
        CI(y);
        --x;
        --y;
        grid[x][y]=-1;
        CI(r);
        e.pb( mk(x, mk(y,r) ) );
    }
}

inline void Proc() {
    fo(i,0,R){
        fo(j,0,C){
            for(int k=0; k<tot; ++k){
                int d = (i-e[k].f)*(i-e[k].f) + (j-e[k].s.f)*(j-e[k].s.f)  ;
                if( d<= (e[k].s.s*e[k].s.s) ){
                    grid[i][j]=-1;
                    break;
                }
            }
        }
    }
}

inline void Print(){
    fo(i,0,R){
        fo(j,0,C){
            printf("%2d",grid[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}
inline void BFS(){
    fo(i,0,R){
        fo(j,0,C){
            cost[i][j]=(int)1023456789;
        }
    }

    queue< pair<int,int> > q;
    if( grid[0][0]!=-1 ){
        q.push( mk(0,0) );
        cost[0][0]=0;
    }
    while( q.empty()==false ){
        pair<int,int> t = q.front();
        q.pop();
        fo(i,0,4){
            int tr = t.f + mr[i];
            int tc = t.s + mc[i];
            if( tr<0 || tc<0 || tr>=R || tc>=C)continue;
            if( grid[tr][tc]==-1)continue;
            if( cost[t.f][t.s]+1 < cost[tr][tc] ){
                q.push( mk(tr,tc) );
                cost[tr][tc] = cost[t.f][t.s]+1;
            }
        }
    }

    if( cost[R-1][C-1]<(int)1023456789 ){
        cout<<cost[R-1][C-1]<<"\n";
    }
    else{
        cout<<"Impossible.\n";
    }
}
int main() {
#ifndef ONLINE_JUDGE
    freopen("in", "rt", stdin);
#endif

    while( scanf("%d %d",&R,&C)==2 ){
        if( R==0 && C==0 )break;
        Read();
        Proc();
        BFS();
    }

    return 0;
}


